#ifndef DEF_MNT
#define DEF_MNT

// Structure du mnt
class MNT
{
		
    public :

    // Constructeur 
    MNT();
    MNT(std::string nomFichier);
    MNT(int ligne,int colonne);
    MNT(int ligne,int colonne, float __NODATA_value,float __xllcorner,float __yllcorner,float __cellsize);

    // Setters 
    void modifierLigne(int nb);
    void modifierColonne(int nb);
    void modifierData(float data);
    void creerTableau(int ligne , int colonne);
    
    // Getters
    int ligne();
    int colonne();
    float data();
    int x();
    int y();
    int cell();
    float * monTableau();

    // Methode
    void afficherMNT();
    void ecrire(std::string nomFichier);
    float calculMax();
    float * remplir(int nbLigneMNT , int pid , int nprocs, float max);
    void initialiserTableau(float * W);
    void envoi(int nprocs , int pid);
	void envoiLignePartageFlux(MNT lignesPartages, int nprocs, int pid);
    bool algorithmeRemplisage(MNT Z);
    float * mesVoisin(int pos);
	int * mesVoisinIndice(int pos);
    void algoDirection(MNT W);
	void initialiserFlux();
	void reinitialiserFluxLignesPartagees();
    void algoFlux(MNT direction, MNT dejaVu, int pos);
	bool continuerCheminFlux(MNT dejaVu, int pos);
	bool * deversementVoisins(int pos);
	int sommeDeversemmentVoisin(int pos);
    void retourEcriture(int debut, int pid, int nprocs , int nbLignesParProcs , int nbLignes,int nbColonnes , std::string nomFichier);
    bool testDirection(int debut , int fin);

    private :

	// On déclare nos attributs
    int nbLigne;
    int nbColonne;
    float NODATA_value;
    float * tableau;
    float xllcorner;
    float yllcorner;
    float cellsize;
};

#endif
